package lp2.projeto;

import java.util.*;
import java.io.*;

import org.junit.Assert;

public class MultiAgenda {
	private static Map<Usuario, Agenda> agendas = new HashMap<Usuario,Agenda>();
	private static Agenda agendaEmUso;
	private static Usuario chaveEmUso;
	static String nome, descricao, email, telefone, endereco, aniversario, comentario, nomeFormaDeContato, enderecoFormaDeContato, descricaoFormaDeContato;
	static FormaDeContato formaDeContato;
	private static Usuario usuario;
	private static Evento evento;
	private static Contato contato;
	private static Scanner sc;
	
	
	public static void main(String[] args) throws Exception {
				
		if(new File("agendas.dat").exists()){
			try {
				agendas = leArquivoObjeto("agendas.dat");
				System.out.println("existe");
				System.out.println(agendas.size());
			} catch (IOException e) {
				e.printStackTrace();
				System.out.println("ex no ler");
			}
		}else{
			try {
				escreveArquivoObjeto("agendas.dat", agendas);
				System.out.println("cria");
			} catch (IOException e) {
				e.printStackTrace();
				System.out.println("erro no cria");
			}
		}
		boolean controle = true;
		while(controle){
			
			sc = new Scanner(System.in);
			String opcaoMenu;
			int opcao;
			
			primeiraTela();
			
			opcaoMenu = sc.nextLine();
			try{
				opcao = Integer.parseInt(opcaoMenu); 
			}catch (Exception e){
				System.err.println("Digite um numero valido");
				continue;
			}
			
			switch(opcao){
				case 1:
					limpaTela();
					barras();
					menuCadastraNovoUsuario();
					limpaTela();
					break;
				
				case 2:
					limpaTela();
					barras();
					
					System.out.print("Digite seu email: ");
					email = sc.nextLine();
					
					boolean procuraUsuario = false;
					for(Usuario key: agendas.keySet()){
						if(key.getEmail().equals(email)){
							agendaEmUso = agendas.get(key);
							chaveEmUso = key;
							System.out.println("agenda" + agendaEmUso.toString());
							procuraUsuario = true;
							break;
						}
					}
					
					if(procuraUsuario){
						limpaTela();
						barras();
						menuAgenda();
					}else{
						limpaTela();
						barras();
						System.out.println("Voce ainda nao esta cadastrado, volte ao menu principal e faca seu cadastro.");
					}
					break;
				case 3:
					controle = false;
				
				default:
					System.out.println("teste");
					
				}
		}
			
		try {
			escreveArquivoObjeto("agendas.dat", agendas);
			System.out.println("cria");
		} catch (IOException e) {
			System.out.println("erro no cria");
		}
		System.out.println(agendas.size());
			
		}
		
		

	
	
	private static void escreveArquivoObjeto(String nome, Map<Usuario, Agenda> agendaas) throws IOException{
		ObjectOutputStream out = null;
		boolean openOut = false;
		
		try{
			out = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(nome)));
			openOut = true;
			out.writeObject(agendaas);
			
		}catch(IOException e){
			System.err.println(e.getMessage());
		}finally{
			if(openOut)
				out.close();
		}
	}
	
	private static Map<Usuario, Agenda> leArquivoObjeto(String nome) throws IOException{
		ObjectInputStream in = null;
		Map<Usuario, Agenda> agendaas = null;
		boolean openIn = false;
		
		try{
			in = new ObjectInputStream(new BufferedInputStream(new FileInputStream(nome)));
			openIn = true;
			agendaas = (HashMap<Usuario,Agenda>) in.readObject();
		}catch(ClassNotFoundException e){
			System.err.println(e.getMessage());
		}catch(IOException e){
			System.err.println(e.getMessage());
		}finally{
			if(openIn)
				in.close();
		}
		return agendaas;
	}

	
	private static void barras() {
		System.out.println("---------------------------------------------------------------------------------------");
	}
	
	private static void primeiraTela(){
		System.out.println("Bem-vindo(a) Agenda Multitudo!!");
		barras();
		System.out.println("Digite:");
		System.out.println("1 - Novo usuario?");
		System.out.println("2 - Ja e cadastrado?");
		System.out.println("3 - Sair da Agenda Multitudo?");
	}
	
	
	private static void menuCadastraNovoUsuario(){
		System.out.print("Nome do usuario: ");
		nome = sc.nextLine();
		System.out.print("Sua descricao: ");
		descricao = sc.nextLine();
		System.out.print("Seu email: ");
		email = sc.nextLine();
		
		usuario = new Usuario(nome, descricao, email);
		agendas.put(usuario, new Agenda());
		agendas.get(usuario).addPerfilDeUsuario(nome, descricao, email);
		System.out.println("Seu perfil foi cadastrado com sucesso!");
	}

	
	private static void limpaTela(){
		System.out.println("\n\n\n");
	}
	
	private static void menuAgenda() throws Exception{
		limpaTela();
		barras();
		String opcaoMenu;
		int opcao;
		boolean controle2 = true;
		System.out.println("entrou");
		
		while(controle2){
			System.out.println("Selecione uma opcao");
			System.out.println("1 - Visualizacoes ou Modificacoes relativas ao seu perfil");
			System.out.println("2 - Visualizacoes ou Modificacoes relativas aos eventos");
			System.out.println("3 - Visualizacoes ou Modificacoes relativas aos contatos");
			System.out.println("4 - Fazer logout");
			opcaoMenu = sc.nextLine();
		
			try{
				opcao = Integer.parseInt(opcaoMenu);
			}catch (Exception e){
				System.err.println("Digite um numero valido");
				continue;
			}
			switch(opcao){
				case 1:
					limpaTela();
					barras();
					menuPerfil();
					break;
				case 2:
					limpaTela();
					barras();
					menuEventos();
					break;
				case 3:
					limpaTela();
					barras();
					menuContatos();
					break;
				case 4:
					agendas.put(chaveEmUso, agendaEmUso);
					chaveEmUso = null;
					agendaEmUso = null;
					controle2 = false;
			}
		}
	}
	
	private static void menuPerfil(){
        String opcaoMenu;
        int opcao = 0;
        boolean controle3 = true;
       
        while(controle3){
	        System.out.println("Selecione uma opcao");
	        System.out.println("1 - Para visualizar seu perfil");
	        System.out.println("2 - Alterar dados do perfil");
	        System.out.println("3 - Voltar");
	        
	        opcaoMenu = sc.nextLine();
       
			try{
				opcao = Integer.parseInt(opcaoMenu);
			}catch (Exception e){
				System.err.println("Digite um numero valido");
			}
	        switch(opcao){
	            case 1:
	                limpaTela();
	                barras();
	                
	                System.out.println(agendaEmUso.getPerfilDoUsuario());
	                break;
	            case 2:
	                limpaTela();
	                barras();
	                menuAlteraPerfil();
	                break;
	            case 3:
	            	controle3 = false;
	                break;       
	          }   
        }   
   }
	
	private static void menuAlteraPerfil(){
		int opcao = 0;
		String opcaoMenu ;
		String novoDado;
		
		System.out.println("Selecione uma opcao");
		System.out.println("1 - Alterar nome");
		System.out.println("2 - Alterar email");
		System.out.println("3 - Alterar ou criar descricao ");
		
		opcaoMenu = sc.nextLine();
		try{
			opcao = Integer.parseInt(opcaoMenu);
		}catch (Exception e){
			System.err.println("Digite um numero valido");
		}
		
		switch(Integer.parseInt(opcaoMenu)){
			case 1:
				limpaTela();
				barras();
				System.out.println("Digite o novo nome:");
				novoDado = sc.nextLine();
				agendaEmUso.setNomeDoUsuario(novoDado);
				break;
			case 2:
				limpaTela();
				barras();
				System.out.println("Digite o novo e-mail:");
				novoDado = sc.nextLine();
				agendaEmUso.setEmailDoUsuario(novoDado);
				break;
			case 3:
				limpaTela();
				barras();
				System.out.println("Digite a nova Descri�ao:");
				novoDado = sc.nextLine();
				agendaEmUso.setDescricaoDoUsuario(novoDado);
				break;
		
		}
	}

	private static void menuEventos(){
		String opcaoMenu;
		int opcao = 0;
		boolean controle3 = true;
		
		while(controle3){
			
			System.out.println("Selecione uma opcao");
			System.out.println("1 - Adicionar evento");//tirar os sysos
			System.out.println("2 - Visualizar Eventos");
			System.out.println("3 - Adicionar contato a evento");
			System.out.println("4 - Buscar evento por contato");
			System.out.println("5 - Voltar ");
			
			opcaoMenu = sc.nextLine();
			try{
				opcao = Integer.parseInt(opcaoMenu);
			}catch (Exception e){
				System.err.println("Digite um numero valido");
				continue;
			}
			
			switch(opcao){
				case 1:
					limpaTela();
					barras();
					addEvento();
					break;
				case 2:
					//passagemDeEventos();
					System.out.println("Eventos Futuros\n" + agendaEmUso.getEventosFuturos().toString());
					System.out.println("Eventos Passados\n" + agendaEmUso.getEventosPassados().toString());
					break;
				case 3:
					limpaTela();
					barras();
					adicionaContatoEmEvento();
				case 4:
					limpaTela();
					barras();
					buscarEventoPorContato();
				case 5:
					controle3 = false;
					break;
			}
			

		}
	}
	
	private static void addEvento(){
		String nome, data, horario, duracao, descricao, tipo;
		//passagemDeEventos();
		
		System.out.println("Digite o nome do evento");
		nome = sc.nextLine();
		System.out.println("Digite a data do evento - (dd/mm/aaaa)");
		data = sc.nextLine();
		System.out.println("Digite o horario do evento - (hh:mm)");
		horario = sc.nextLine();
		System.out.println("Digite a duracao do evento - em minutos");
		duracao = sc.nextLine();
		System.out.println("Digite uma descricao para o evento");
		descricao = sc.nextLine();
		System.out.println("Digite um tipo para o evento - Opcional");
		tipo = sc.nextLine();
		
		if(tipo.equals("")){
			try {
				System.out.println("sem tipo");
				System.out.println("Eventos Futuros                   Eventos Passados\n" + agendaEmUso.getEventosFuturos().toString() + "                   " +agendaEmUso.getEventosPassados().toString());
				agendaEmUso.addEventos(nome, data, horario, duracao, descricao);
				System.out.println("Evento adicionado com sucesso");
				System.out.println("Eventos Futuros                   Eventos Passados\n" + agendaEmUso.getEventosFuturos().toString() + "                   " +agendaEmUso.getEventosPassados().toString());
			} catch (Exception e) {
				System.out.println("sem tipo exce");
				if(e.getMessage().equals("Conflito de horario")){
					System.out.println("semtipoexceif");
					try {
						resolveConflito(new Evento(nome, data, horario, duracao,descricao));
					} catch (Exception e1) {
						System.err.println(e1.getMessage());
					}
				}else{
				System.err.println(e.getMessage());
				}
			}
		}else{
			try {
				System.out.println("com tipo");
				System.out.println("Eventos Futuros                   Eventos Passados\n" + agendaEmUso.getEventosFuturos().toString() + "                   " +agendaEmUso.getEventosPassados().toString());
				agendaEmUso.addEventos(nome, data, horario, duracao, descricao, tipo);
				System.out.println("Evento adicionado com sucesso");
				System.out.println("Eventos Futuros                   Eventos Passados\n" + agendaEmUso.getEventosFuturos().toString() + "                   " +agendaEmUso.getEventosPassados().toString());
			} catch (Exception e) {
				System.out.println("comtipoexce");
				if(e.getMessage().equals("Conflito de horario")){
					System.out.println("cemtipoexceif");
					try {
						resolveConflito(new Evento(nome, data, horario, duracao,descricao,tipo));
					} catch (Exception e1) {
						System.err.println(e1.getMessage());
					}
				}else{
					System.err.println(e.getMessage());
				}	
			}
		}
	}
	
	public static void resolveConflito(Evento novoEvento){
		//System.out.println("entro no resolve cnflito");
		String opcaoMenu;
		int opcao = 0;
		boolean controle4 = true;
		while(controle4){
			
			System.out.println("Selecione a opcao:");
			System.out.println("1 - Para sobrescrever o evento");
			System.out.println("2 - Manter evento");
						
			opcaoMenu =sc.nextLine();
			try{
				opcao = Integer.parseInt(opcaoMenu);
			}catch (Exception e){
				System.err.println("Digite um numero valido");
				continue;
			}
			
			switch(opcao){
				case 1:
					for(Evento evento: agendaEmUso.getEventosFuturos()){
						if (novoEvento.verificaConflito(evento)){
							agendaEmUso.getEventosFuturos().remove(evento);
							break;
						}
					}
					for(Evento evento: agendaEmUso.getEventosPassados()){
						if (novoEvento.verificaConflito(evento)){
							agendaEmUso.getEventosPassados().remove(evento);
							break;
						}
					}
					
					try {
						agendaEmUso.addEventos(novoEvento.getNome(), novoEvento.getData(), novoEvento.getHorario(), novoEvento.getDuracao(), novoEvento.getDescricao());
						System.out.println("Novo evento adicionado");
					} catch (Exception e) {
						System.out.println(e.getMessage());
					}
					
					controle4 = false;
				case 2:	
					System.out.println("opao2");
					controle4 = false;
			}		
		}
	}
	
	private static void adicionaContatoEmEvento(){
    			
    	String escolha, primeirasLetras, contatoEscolhido;
    	int indice, opcao;
    	List<Contato> contatosEncontrados = new ArrayList<Contato>();
    	Contato contato;
    	Evento eventoEscolhido = null;
    	
    	while(true){
 
	    	System.out.println("Eventos Futuros\n" + agendaEmUso.getEventosFuturos().toString());
			System.out.println("Eventos Passados\n" + agendaEmUso.getEventosPassados().toString());
		   	barras();
			System.out.println("Digite o nome do evento");
	    	escolha = sc.nextLine();
	    	
	    	for(Evento evento1: agendaEmUso.getEventosFuturos()){
	    		if(escolha.equals(evento1.getNome())){
	    			eventoEscolhido = evento1;
	    			break;
	    		}
	    	}
	    	
	    	for(Evento evento1: agendaEmUso.getEventosPassados()){
	    		if(escolha.equals(evento1.getNome())){
	    			eventoEscolhido = evento1;
	    			break;
	    		}
	    	}
	    	if(eventoEscolhido == null){
	    		continue;
	    	}else{
	    		break;
	    	}
    	
    	}
    	
    	while(true){
    	System.out.print("Digite as primeiras letras do nome do contato: ");
    	primeirasLetras = sc.nextLine();
    	
    	Iterator<Contato> it = agendaEmUso.getContatos().iterator();
    	while(it.hasNext()){
    		contato = it.next();
    		if(contato.getNome().startsWith(primeirasLetras)){
    			contatosEncontrados.add(contato);
    		}
    	}
    	
    	System.out.println("\nResultado da busca: \n");
    	
    	if(contatosEncontrados.size() == 0){
    		System.out.println("Nenhum contato encontrado, deseja realizar uma nova busca?");
    		System.out.println("1 - Sim");
    		System.out.println("Outro - Voltar para o menu de eventos");
    		
    		escolha = sc.nextLine();
    		try{
    			opcao = Integer.parseInt(escolha);
    		}catch (Exception e){
    			System.err.println("Digite um numero valido");
    			continue;
    		}
    		if(opcao == 1){
    			continue;
    		}else{
    			break;
    		}
    	}else{
			while(true){
	    		for(Contato contato2: contatosEncontrados){
					System.out.printf("%d - %s", contatosEncontrados.indexOf(contato2) + 1, contato2.getNome());
				}	
	    		System.out.println("\nDigite agora o numero referente ao contato escolhido: ");
	        	contatoEscolhido = sc.nextLine();
	        	try{
					indice = Integer.parseInt(contatoEscolhido);
					Assert.assertTrue(indice <= contatosEncontrados.size());
					break;
				}catch (Exception e){
					System.err.println("Digite um numero valido");
					continue;
				}
			}
			agendaEmUso.addContatoEmEvento(eventoEscolhido, contatosEncontrados.get(indice -1));
        	break;
		}
    	}
    }
	
	private static void menuContatos() throws Exception {
		limpaTela();
		
		String opcaoMenu;
		int opcao;
		
		boolean aindaEmMenuContatos = true;
		while(aindaEmMenuContatos) {
			limpaTela();
			barras();
			
			System.out.println("Selecione uma opcao:");
			System.out.println("1 - Cadastrar contato");
			System.out.println("2 - Atualizar contato");
			System.out.println("3 - Listar Contatos");
			System.out.println("4 - Remover contato");
			System.out.println("5 - Voltar para o menu principal");
			
			opcaoMenu = sc.nextLine();
			
			try{
				opcao = Integer.parseInt(opcaoMenu);
			}catch (Exception e){
				System.err.println("Digite um numero valido");
				continue;
			}
			
			switch(opcao) {
		    case 1:
		    	menuCadastraContato();
		    	break;
		    
		    case 2:
		    	AtualizaContato();
		    	break;
		    
		    case 3:
		    	listaContatos();
		    	break;
		    	
		    case 4:
		    	RemoveContato();
		    	break;
		    	
		    case 5:
		    	aindaEmMenuContatos = false;
		}
		}
		
	}
	
	private static void listaContatos() {
		limpaTela();
		barras();
		
		List<Contato> todosContatos = agendaEmUso.getContatos();
		if(todosContatos.size() == 0) {
			System.out.println("Nenhum contato foi cadastrado.");
		}
		else {
			for( Contato c: todosContatos ) {
				System.out.println("_");
				System.out.println(c + "\n");
			}
		}
		
	}
	
	private static void menuCadastraContato() throws Exception {
		limpaTela();
		barras();
		
		System.out.print("Nome: ");
		nome = sc.nextLine();
		System.out.print("Telefone: ");
		telefone = sc.nextLine();
		System.out.print("Endereco: ");
		endereco = sc.nextLine();
		System.out.print("Aniversario: ");
		aniversario = sc.nextLine();
		System.out.print("Comentario: ");
		comentario = sc.nextLine();
		
		System.out.println("Forma de Contato: ");
		System.out.print(" - Nome da forma de contato: ");
		nomeFormaDeContato = sc.nextLine();
		System.out.print(" - Endereco: ");
		enderecoFormaDeContato = sc.nextLine();
		System.out.print(" - (Opcional) Descricao: ");
		descricaoFormaDeContato = sc.nextLine();
		
		formaDeContato = new FormaDeContato(nome, endereco, descricaoFormaDeContato);
		contato = new Contato(nome, telefone, endereco, aniversario, formaDeContato, comentario);

		agendaEmUso.addContato(contato);
		
		System.out.println("\nContato cadastrado com sucesso!");
		
	}
	
	private static void AtualizaContato() {
		limpaTela();
		barras();
		int opcao = -1;
		
		if(checaListaContato()) {
			List<Contato> contatosEncontrados = procurandoContatos();
			
			boolean atualizando = true;
			while(atualizando) {
				
				System.out.println("\nPressione 'ENTER' para ir ao menu anterior");
				System.out.print("Digite o numero do contato a ser editado: ");
				
				String opcaoAtualizacao = sc.nextLine();
				
				if(opcaoAtualizacao.trim().equals("")) {
					opcao = -1;
					break;
				}
				
				try{
					opcao = Integer.parseInt(opcaoAtualizacao);
					if(opcao >= contatosEncontrados.size() || opcao < 0){
						throw new Exception();
					}
				}catch (Exception e){
					System.err.println("Digite um numero valido");
					continue;
				}
				atualizando = false;//se ele digitar um numero correto sai do loop
			}
			if (opcao != -1) {
				Contato contatoAEditar = contatosEncontrados.get(opcao);
				System.out.println(contatoAEditar);
				menuEditaContato(contatoAEditar);
			}
		}
		else {
			System.out.println("Falha na edicao de contato, tente novamente.");
		}
	}
	
	//so vai retornar contato = null, se a pessoa quiser voltar de menu
	// entao nao vai dar nullpointer pq o objeto contato nao sera usado
	private static List<Contato> procurandoContatos() {
		int indiceContato = -1;
		List<Contato> contatosEncontrados = null;
		
		boolean contatoNaoAchado = true;
		while(contatoNaoAchado) {
			String retornoMenu = "";
			
			System.out.println("Pressione 'ENTER' para ir ao menu anterior.");
			System.out.print("Nome ou parte do nome do candidato: ");
			
			nome = sc.nextLine();
			if(nome.trim().equals(retornoMenu)) {
				break;
			}
			
			contatosEncontrados = agendaEmUso.procuraContato(nome);
			if( contatosEncontrados.size() == 0 ) {
				System.out.println("Contato nao encontrado.\n");
			}
			else if( contatosEncontrados.size() == 1 ) {
				System.out.println("\nContato encontrado:\n");
				System.out.println("0 - " + contatosEncontrados.get(0));
				
				contatoNaoAchado = false;
			}
			else if (contatosEncontrados.size() > 1) {//se for encontrado mais de um contato...
				System.out.println("Contatos encontrados:\n");
				for(Contato c: contatosEncontrados) {
					indiceContato++;
					System.out.println(indiceContato + " - " + c + "\n");
				}
				contatoNaoAchado = false;
			}
		}
		return contatosEncontrados;
	}
	
	private static void menuEditaContato(Contato contato) {
		
		String opcaoMenu;
		int opcao;
		
		boolean emMenuEditaContato = true;
		while(emMenuEditaContato) {
			limpaTela();
			barras();
			
			System.out.println("Selecione uma opcao para ser editada: ");
			System.out.println("1 - Nome");
			System.out.println("2 - Telefone");
			System.out.println("3 - Endereco");
			System.out.println("4 - Aniversario");
			System.out.println("5 - Comentario");
			System.out.println("6 - Forma de contato");///////////////
			System.out.println("7 - Adicionar forma de contato");
			System.out.println("8 - Remover forma de contato");
			System.out.println("9 - Voltar para o menu anterior");
			
			opcaoMenu = sc.nextLine();
			
			try{
				opcao = Integer.parseInt(opcaoMenu);
			}catch (Exception e){
				System.err.println("Digite um numero valido");
				continue;
			}
			
			switch(opcao) {
			    case 1:
			    	System.out.print("Novo nome: ");
			    	nome = sc.nextLine();
			    	contato.setNome(nome);
			    	System.out.println("Contato editado com sucesso!");
			    	break;
			    
			    case 2:
			    	System.out.print("Novo telefone: ");
			    	telefone = sc.nextLine();
			    	contato.setTelefone(telefone);
			    	System.out.println("Contato editado com sucesso!");
			    	break;
			    
			    case 3:
			    	System.out.print("Novo endereco: ");
			    	endereco = sc.nextLine();
			    	contato.setEndereco(endereco);
			    	System.out.println("Contato editado com sucesso!");
			    	break;
			    	
			    case 4:
			    	System.out.print("Novo aniversario");
			    	aniversario = sc.nextLine();
			    	contato.setAniversario(aniversario);
			    	System.out.println("Contato editado com sucesso!");
			    	break;
			    	
			    case 5:
			    	System.out.print("Novo comentario: ");
			    	comentario = sc.nextLine();
			    	contato.setComentario(comentario);
			    	System.out.println("Contato editado com sucesso!");
			    	break;
			    	
			    case 6:
			    	editaFContato();
			    	break;
			    	
			    case 7:
			    	System.out.print(" - Nome da forma de contato: ");
					nomeFormaDeContato = sc.nextLine();
					System.out.print(" - Endereco: ");
					enderecoFormaDeContato = sc.nextLine();
					System.out.print(" - (Opcional) Descricao: ");
					descricaoFormaDeContato = sc.nextLine();
					
					formaDeContato = new FormaDeContato(nomeFormaDeContato, enderecoFormaDeContato, descricaoFormaDeContato);
					contato.addFormaDeContato(formaDeContato);
					System.out.println("Forma de contato adicionado com sucesso!");
					break;
			    case 8:
			    	removeFContato();
			    	break;
			    	
			    case 9:
			    	emMenuEditaContato = false;
				}
		}
	}
	private static boolean checaListaFormaContato() {//caso sejam removidas todas as formas de contato
		if(contato.getFormaDeContato().size() == 0) {
			System.out.println("Nenhuma forma de contato registrada.");
			return false;
		}
		return true;
	}
	
	private static void removeFContato() {
		limpaTela();
		barras();
		int opcao = -1;
		
		listarFContato();
		
		if(checaListaFormaContato()) {
			List<FormaDeContato> listaFContato = contato.getFormaDeContato();
			
			boolean removendo = true;
			while(removendo) {
				
				System.out.println("\nPressione 'ENTER' para ir ao menu anterior");
				System.out.print("Digite o numero da forma de contato a ser removida: ");
				
				String opcaoRemocao = sc.nextLine();
				
				if(opcaoRemocao.trim().equals("")) {
					opcao = -1;
					break;
				}
				
				try{
					opcao = Integer.parseInt(opcaoRemocao);
					if(opcao >= listaFContato.size() || opcao < 0){
						throw new Exception();
					}
				}catch (Exception e){
					System.err.println("Digite um numero valido");
					continue;
				}
				removendo = false;//se ele digitar um numero correto sai do loop
			}
			if (opcao != -1) {
				FormaDeContato fContatoARemover = listaFContato.get(opcao);
				contato.removeFCOntato(fContatoARemover);
				System.out.println("Forma de contato removida com sucesso!");
			}
		}
		else {
			System.out.println("Falha na remocao de forma de contato, tente novamente.");
		}
	}
	private static void editaFContato() {
		limpaTela();
		barras();
		int indiceFContato = -1;
		
		List<FormaDeContato> listaFContato = contato.getFormaDeContato();
		
		if(checaListaFormaContato()) {
			int quantFormasDeContato = contato.getFormaDeContato().size();
			
			if(quantFormasDeContato == 1) {
				FormaDeContato fContato = contato.getFormaDeContato().get(0);
				System.out.println("0 - " + fContato);
				selecionaFormaContato();
			}
			else if(quantFormasDeContato > 1) {
				for( FormaDeContato f: listaFContato ) {
					indiceFContato++;
					System.out.println(indiceFContato+ " - " + f);
				}
				selecionaFormaContato();
			}
		}
		
	}
	
	private static void selecionaFormaContato() {
		limpaTela();
		barras();
		int opcao = -1;
		List<FormaDeContato> listaFContato = contato.getFormaDeContato();
			
		boolean editando = true;
		while(editando) {
			System.out.println("Pressione 'ENTER' para ir ao menu anterior.");
			System.out.print("Digite o numero da forma de contato a ser editada: ");
			
			String opcaoEdicao = sc.nextLine();
			
			if(opcaoEdicao.trim().equals("")) {
				opcao = -1;
				break;
			}
			
			try{
				opcao = Integer.parseInt(opcaoEdicao);
				if(opcao >= listaFContato.size() || opcao < 0){
					throw new Exception();
				}
			}catch (Exception e){
				System.err.println("Digite um numero valido");
				continue;
			}
			editando = false;
		}
		
		if(opcao != -1) {
			FormaDeContato fContatoAEditar = listaFContato.get(opcao);
			menuEditaFContato(fContatoAEditar);
		}
	}
	
	private static void menuEditaFContato(FormaDeContato fContato) {
		String opcaoMenu;
		int opcao;
		
		boolean emMenuEditaFContato = true;
		while(emMenuEditaFContato) {
			limpaTela();
			barras();
			
			System.out.println("Selecione uma opcao para ser editada: ");
			System.out.println("1 - Nome");
			System.out.println("2 - Endereco");
			System.out.println("3 - Descricao");
			System.out.println("4 - Listar formas de contato");
			System.out.println("5 - Voltar para o menu anterior");
			
			opcaoMenu = sc.nextLine();
			
			try{
				opcao = Integer.parseInt(opcaoMenu);
			}catch (Exception e){
				System.err.println("Digite um numero valido");
				continue;
			}
			
			switch(opcao) {
			    case 1:
			    	System.out.print("Novo nome: ");
			    	nome = sc.nextLine();
			    	fContato.setNome(nome);
			    	System.out.println("Forma de contato editada com sucesso!");
			    	break;
			    
			    case 2:
			    	System.out.print("Novo endereco: ");
			    	endereco = sc.nextLine();
			    	fContato.setEndereco(endereco);
			    	System.out.println("Forma de contato editada com sucesso!");
			    	break;
			    
			    case 3:
			    	System.out.print("Nova descricao: ");
			    	descricao = sc.nextLine();
			    	fContato.setDescricao(descricao);
			    	System.out.println("Forma de contato editado com sucesso!");
			    	break;
			    
			    case 4:
			    	listarFContato();
			    	break;
			    case 5:
			    	emMenuEditaFContato = false;
		    }
	    }
	}
	private static void listarFContato() {
		int indiceFContato = -1;
		
		List<FormaDeContato> listaFContato = contato.getFormaDeContato();
		for(FormaDeContato fContato: listaFContato) {
			indiceFContato++;
			System.out.println(indiceFContato + " - " + fContato);
		}
	}
	
	private static boolean checaListaContato() {
		List<Contato> todosContatos = agendaEmUso.getContatos();
		if(todosContatos.size() == 0) {
			System.out.println("Nenhum contato foi cadastrado.");
			return false;
		}
		return true;
	}
	
	private static void RemoveContato() {
		limpaTela();
		barras();
		int opcao = -1;
		
		if(checaListaContato()) {
			List<Contato> contatosEncontrados = procurandoContatos();
			
			boolean removendo = true;
			while(removendo) {
				
				System.out.println("\nPressione 'ENTER' para ir ao menu anterior");
				System.out.print("Digite o numero do contato a ser removido: ");
				
				String opcaoRemocao = sc.nextLine();
				
				if(opcaoRemocao.trim().equals("")) {
					opcao = -1;
					break;
				}
				
				try{
					opcao = Integer.parseInt(opcaoRemocao);
					if(opcao >= contatosEncontrados.size() || opcao < 0){
						throw new Exception();
					}
				}catch (Exception e){
					System.err.println("Digite um numero valido");
					continue;
				}
				removendo = false;//se ele digitar um numero correto sai do loop
			}
			if (opcao != -1) {
				Contato contatoARemover = contatosEncontrados.get(opcao);
				agendaEmUso.removerContato(contatoARemover);
				System.out.println("Contato removido com sucesso!");
			}
		}
		else {
			System.out.println("Falha na remocao de contato, tente novamente.");
		}
	}
	
	
	
	private static void buscarEventoPorContato(){
		
	}
}